package poly3;
/*
    ClassCastException: 类型转换异常

    解决办法: 提前判断,如果父引用是这个类就转,不是这个类型就不转
        1. 父引用 instanceof 类型 : 判断前面的父引用所接受的真实对象类型是否是of后面的类型 --> 返回boolean类型结果
            if(父引用 instanceof 类型){
                //向下转型
            }
        2. 父引用.getClass() -> 获取对象的字节码对象
           类名.class -> 获取类的字节码对象
           一个类只可能有一个字节码对象
           if(父引用.getClass() == 类名.class){
                //向下转型
           }
 */
public class Demo {
    public static void main(String[] args) {
        //创建一个Animal对象 -> 以多态的形式创建对象
        Animal a = new Shark();
        a.eat();//多态父引用只能调用和子类的共有成员
        //向下转型
        Shark shark = (Shark) a;
        System.out.println("shark.weight = " + shark.weight);
        shark.diving();
        System.out.println("-----------------------");
        //向下转型是不安全的
        if (a instanceof Dog){
            Dog dog = (Dog) a;
            System.out.println("dog.name = " + dog.name);
            dog.swim();
        }
        System.out.println("-----------------------");
        //向下转型需要提前做安全判断
        //shark类的字节码对象 == Cat类的字节码对象
        if (a.getClass() == Cat.class){//false
            Cat cat = (Cat) a;
            System.out.println("cat.age = " + cat.age);
            cat.catchMouse();
        }
    }
}
interface Animal{
    public abstract void eat();
}

class Shark implements Animal{

    int weight;

    @Override
    public void eat() {
        System.out.println("鲨鱼吃人~");
    }

    public void diving(){
        System.out.println("潜水~");
    }
}

class Dog implements Animal{

    String name;

    @Override
    public void eat() {
        System.out.println("狗吃骨头~");
    }

    public void swim(){
        System.out.println("狗刨~");
    }
}

class Cat implements Animal{

    int age;

    @Override
    public void eat() {
        System.out.println("猫吃罐头~");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠~");
    }
}